from django.shortcuts import render, redirect, HttpResponse
from app01 import models
# 把文件写入内存
from io import BytesIO
from django import forms
from app01.utils.bootstrap import BootStrapFrom
from app01.utils.encrypt import md5
from app01.utils.code import check_code


class LoginForm(BootStrapFrom):
    # username = forms.CharField(
    #     label='用户名',
    #     widget=forms.TextInput(attrs={"class": "form-control"})
    # )
    # password = forms.CharField(
    #     label='密码',
    #     widget=forms.PasswordInput(attrs={"class": "form-control"})
    # )
    username = forms.CharField(
        label='用户名',
        widget=forms.TextInput,
        required=True  # 默认是不能为空的
    )
    password = forms.CharField(
        label='密码',
        widget=forms.PasswordInput(render_value=True),  # render_value=True 错误后保留先前输入得到密码
        required=True
    )
    code = forms.CharField(
        label='验证码',
        widget=forms.TextInput,  # render_value=True 错误后保留先前输入得到密码
        required=True
    )

    # {'username': 'wupingzs', 'password': '096c9af13e2594ec4bdd04568c0a1e9a'}
    def clean_password(self):
        password = self.cleaned_data.get('password')
        return md5(password)


def login(request):
    """登录"""
    if request.method == "GET":
        form = LoginForm()
        return render(request, 'login.html', {"form": form})
    form = LoginForm(data=request.POST)
    # 校验验证成功
    if form.is_valid():
        # 表示验证成功

        # 判断验证码是否正确
        user_input_code = form.cleaned_data.pop('code')
        code = request.session.get('image_code', '')

        print(user_input_code.upper(), code.upper())

        if code.upper() != user_input_code.upper():
            form.add_error('code', '验证码错误')  # 主动在form种抛出错误提示
            return render(request, 'login.html', {"form": form})

        # 1，获取到的用户名和密码 {'username': 'hello', 'password': '123456'}
        # print(form.cleaned_data)
        # 2，去数据库校验用户名和密码正确  获取用户对象/None
        # 第一种方法
        # un = form.cleaned_data['username']      # 得到用户输入的用户名
        # pwd = form.cleaned_data['password']     # 等到md5加密的密码
        # # 查询数据库中是否存在
        # admin_object = models.Admin.objects.filter(username=un, password=pwd).first()
        # 第二种方法【 因为form.cleaned_data 本身就是个字典，可以直接加**传
        admin_object = models.Admin.objects.filter(**form.cleaned_data).first()
        if not admin_object:
            # 校验失败
            form.add_error('password', '用户名或密码错误')  # 主动在form种抛出错误提示
            return render(request, 'login.html', {"form": form})
        # 校验成功
        # 网站随机生成字符串; 写到用户浏览器的cookie中; 在写入到session中
        request.session['info'] = {'id': admin_object.id, 'name': admin_object.username}
        # 用户信息可以保存七天【session七天后无效
        request.session.set_expiry(60 * 60 * 24 * 7)
        # 点击登录成功后自动跳转到
        return redirect('/admin/list/')
    # 验证失败返回
    return render(request, 'login.html', {"form": form})


def image_code(request):
    """生成图片验证码"""

    # 1 调用pillow函数，生成图片
    img, code_string = check_code()
    print(code_string)

    # 写入到自己的session中 （以便后续获取这个验证码去进行校验
    request.session['image_code'] = code_string
    # 设置session60秒之后超时【 过了60s图片验证码无效
    request.session.set_expiry(60)

    stream = BytesIO()  # 创建一个文件在内存中
    img.save(stream, 'png')  # 将img对象【图片验证的图片 写到stream中
    return HttpResponse(stream.getvalue())  # 返回给浏览器


def logout(request):
    """注销"""
    # 当前用户的session清除掉
    request.session.clear()
    return redirect('/login/')
